El objetivo de la práctica es realizar en este archivo un análisis exploratorio del dataset seleccionado.
Para la realización del EDA, se ha procedido a elegir y descargar un dataset de www.kaggle.com . Concretamente, el dataset seleccionado es "FIFA 19 complete player dataset". En él, se contienen un conjuntos de observaciones, siendo cada de ellas un jugador de los presentes en el videojuego FIFA 19. Por otra parte, existen un total de 89 columnas o variables. Para la realización del estudio y con el fin de simplificar el análisis, se ha procedido previamente a eliminar una serie de estas variables, para obtener un dataset más manejable, más equilibrado y claro para representar gráficamente.
El dataset en cuestión cuenta con las siguientes variables:
Variables que expresan la calidad del jugador en aspectos concretos, puede tomar valores entre 1 y 99.
En primer lugar, cargamos las librerías necesarias para el estudio.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
player = pd.read_csv("../data/data.csv", delimiter = ';')
player
| Name | Age | Nationality | Overall | Potential | Club | Preferred Foot | Work Rate | Real Face | Position | ... | HeadingAccuracy | Dribbling | BallControl | Acceleration | Agility | ShotPower | Stamina | Strength | Aggression | Penalties | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | L. Messi | 31 | Argentina | 94 | 94 | FC Barcelona | Left | Medium/ Medium | Yes | RF | ... | 70.0 | 97.0 | 96.0 | 91.0 | 91.0 | 85.0 | 72.0 | 59.0 | 48.0 | 75.0 |
| 1 | Cristiano Ronaldo | 33 | Portugal | 94 | 94 | Juventus | Right | High/ Low | Yes | ST | ... | 89.0 | 88.0 | 94.0 | 89.0 | 87.0 | 95.0 | 88.0 | 79.0 | 63.0 | 85.0 |
| 2 | Neymar Jr | 26 | Brazil | 92 | 93 | Paris Saint-Germain | Right | High/ Medium | Yes | LW | ... | 62.0 | 96.0 | 95.0 | 94.0 | 96.0 | 80.0 | 81.0 | 49.0 | 56.0 | 81.0 |
| 3 | De Gea | 27 | Spain | 91 | 93 | Manchester United | Right | Medium/ Medium | Yes | GK | ... | 21.0 | 18.0 | 42.0 | 57.0 | 60.0 | 31.0 | 43.0 | 64.0 | 38.0 | 40.0 |
| 4 | K. De Bruyne | 27 | Belgium | 91 | 92 | Manchester City | Right | High/ High | Yes | RCM | ... | 55.0 | 86.0 | 91.0 | 78.0 | 79.0 | 91.0 | 90.0 | 75.0 | 76.0 | 79.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 18202 | J. Lundstram | 19 | England | 47 | 65 | Crewe Alexandra | Right | Medium/ Medium | No | CM | ... | 40.0 | 42.0 | 43.0 | 54.0 | 60.0 | 43.0 | 40.0 | 47.0 | 46.0 | 43.0 |
| 18203 | N. Christoffersson | 19 | Sweden | 47 | 63 | Trelleborgs FF | Right | Medium/ Medium | No | ST | ... | 52.0 | 39.0 | 40.0 | 41.0 | 38.0 | 41.0 | 43.0 | 67.0 | 47.0 | 43.0 |
| 18204 | B. Worman | 16 | England | 47 | 67 | Cambridge United | Right | Medium/ Medium | No | ST | ... | 46.0 | 45.0 | 44.0 | 70.0 | 50.0 | 45.0 | 55.0 | 32.0 | 32.0 | 55.0 |
| 18205 | D. Walker-Rice | 17 | England | 47 | 66 | Tranmere Rovers | Right | Medium/ Medium | No | RW | ... | 39.0 | 51.0 | 52.0 | 61.0 | 52.0 | 64.0 | 40.0 | 48.0 | 33.0 | 50.0 |
| 18206 | G. Nugent | 16 | England | 46 | 66 | Tranmere Rovers | Right | Medium/ Medium | No | CM | ... | 46.0 | 43.0 | 51.0 | 57.0 | 55.0 | 43.0 | 47.0 | 60.0 | 56.0 | 33.0 |
18207 rows × 21 columns
Se realizan las primeras medidas para observar la forma del dataset. En este caso, existen 18207 observaciones de jugadores y 21 variables. También se realiza un "size", a fin de obtener una visión del tamaño del dataset.
player.shape
(18207, 21)
player.size
382347
Gracias a la instrucción "info" se pueden observar todas las variables, el tipo de cada una de ellas, y las existencia de valores nulos.
player.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 18207 entries, 0 to 18206 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Name 18207 non-null object 1 Age 18207 non-null int64 2 Nationality 18207 non-null object 3 Overall 18207 non-null int64 4 Potential 18207 non-null int64 5 Club 17966 non-null object 6 Preferred Foot 18131 non-null object 7 Work Rate 18131 non-null object 8 Real Face 18131 non-null object 9 Position 18119 non-null object 10 Finishing 18131 non-null float64 11 HeadingAccuracy 18131 non-null float64 12 Dribbling 18131 non-null float64 13 BallControl 18131 non-null float64 14 Acceleration 18131 non-null float64 15 Agility 18131 non-null float64 16 ShotPower 18131 non-null float64 17 Stamina 18131 non-null float64 18 Strength 18131 non-null float64 19 Aggression 18131 non-null float64 20 Penalties 18131 non-null float64 dtypes: float64(11), int64(3), object(7) memory usage: 2.9+ MB
Como existen algunos de estos valores en el dataset, vamos a proceder a eliminar las observaciones que los contienen para evitar que alteren los resultados. Cabía la opción de sustituir los valores nulos por un valor medio. Sin embargo, como hay variables como "Club" que no deben sustuirse de esta manera, se ha decidido eliminar todas las observaciones de jugadores que contengan valores nulos.
player.isnull().sum()
Name 0 Age 0 Nationality 0 Overall 0 Potential 0 Club 241 Preferred Foot 76 Work Rate 76 Real Face 76 Position 88 Finishing 76 HeadingAccuracy 76 Dribbling 76 BallControl 76 Acceleration 76 Agility 76 ShotPower 76 Stamina 76 Strength 76 Aggression 76 Penalties 76 dtype: int64
player.isna().sum()
Name 0 Age 0 Nationality 0 Overall 0 Potential 0 Club 241 Preferred Foot 76 Work Rate 76 Real Face 76 Position 88 Finishing 76 HeadingAccuracy 76 Dribbling 76 BallControl 76 Acceleration 76 Agility 76 ShotPower 76 Stamina 76 Strength 76 Aggression 76 Penalties 76 dtype: int64
Se procede a eliminar las filas donde existen valores nulos o NA.
player = player.dropna()
player.isnull().sum()
Name 0 Age 0 Nationality 0 Overall 0 Potential 0 Club 0 Preferred Foot 0 Work Rate 0 Real Face 0 Position 0 Finishing 0 HeadingAccuracy 0 Dribbling 0 BallControl 0 Acceleration 0 Agility 0 ShotPower 0 Stamina 0 Strength 0 Aggression 0 Penalties 0 dtype: int64
Ahora, observamos todas las variables numéricas que conforman el dataset. Gracias a "describe" podemos ver cómo se comportan, teniendo disponibles datos como su media, mínimos, máximos, y desviación típica, entre otros valores.
player.describe()
| Age | Overall | Potential | Finishing | HeadingAccuracy | Dribbling | BallControl | Acceleration | Agility | ShotPower | Stamina | Strength | Aggression | Penalties | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 | 17890.000000 |
| mean | 25.104136 | 66.245612 | 71.338737 | 45.593292 | 52.302236 | 55.418781 | 58.423700 | 64.601677 | 63.518893 | 55.501174 | 63.205254 | 65.332923 | 55.882784 | 48.556847 |
| std | 4.675190 | 6.922467 | 6.138803 | 19.510032 | 17.368399 | 18.905425 | 16.661141 | 14.947366 | 14.764104 | 17.211441 | 15.895204 | 12.545052 | 17.358040 | 15.694147 |
| min | 16.000000 | 46.000000 | 48.000000 | 2.000000 | 4.000000 | 4.000000 | 5.000000 | 12.000000 | 14.000000 | 2.000000 | 12.000000 | 17.000000 | 11.000000 | 5.000000 |
| 25% | 21.000000 | 62.000000 | 67.000000 | 30.000000 | 44.250000 | 49.000000 | 54.000000 | 57.000000 | 55.000000 | 45.000000 | 56.000000 | 58.000000 | 44.000000 | 39.000000 |
| 50% | 25.000000 | 66.000000 | 71.000000 | 49.000000 | 56.000000 | 61.000000 | 63.000000 | 67.000000 | 66.000000 | 59.000000 | 66.000000 | 67.000000 | 59.000000 | 49.000000 |
| 75% | 28.000000 | 71.000000 | 75.000000 | 62.000000 | 64.000000 | 68.000000 | 69.000000 | 75.000000 | 74.000000 | 68.000000 | 74.000000 | 74.000000 | 69.000000 | 60.000000 |
| max | 45.000000 | 94.000000 | 95.000000 | 95.000000 | 94.000000 | 97.000000 | 96.000000 | 97.000000 | 96.000000 | 95.000000 | 96.000000 | 97.000000 | 95.000000 | 92.000000 |
De cara a realizar un mejor estudio, en primer lugar se van a representar gráficamente algunas de las variables categóricas, con el finde obtener una idea de cómo se distribuyen y comportan.
En primer lugar, vamos a estudiar la nacionalidad, pues no interesa conocer cuáles son las nacionalidades que cuentan con más jugadores dentro del juego.
player['Nationality'].value_counts().head(20)
England 1657 Germany 1195 Spain 1071 Argentina 935 France 911 Brazil 823 Italy 699 Colombia 616 Japan 478 Netherlands 452 Sweden 394 Chile 388 Republic of Ireland 368 China PR 366 Mexico 365 United States 353 Poland 347 Norway 341 Saudi Arabia 337 Denmark 335 Name: Nationality, dtype: int64
Podemos observar que claramente Inglaterra es el país que posee mayor cantidad de jugadores, seguido a cierta distancia por Alemania y España. En total, se pueden observar los 20 países más representados en el dataset.
player['Club'].value_counts().head(30)
Empoli 33 Frosinone 33 Valencia CF 33 Cardiff City 33 FC Barcelona 33 Tottenham Hotspur 33 Rayo Vallecano 33 RC Celta 33 Atlético Madrid 33 Southampton 33 Arsenal 33 Liverpool 33 Manchester United 33 TSG 1899 Hoffenheim 33 Real Madrid 33 Burnley 33 Wolverhampton Wanderers 33 Eintracht Frankfurt 33 CD Leganés 33 Newcastle United 33 Chelsea 33 AS Monaco 33 Borussia Dortmund 33 Manchester City 33 Fortuna Düsseldorf 33 Bournemouth 32 Fulham 32 Levante UD 32 FC Nantes 32 Leicester City 32 Name: Club, dtype: int64
En cuanto a clubes se refiere, la situación es mucho más equilibrada. El valor máximo de jugadores de un mismo equipo asciende 33, el cual es compartido por varios equipos. Arriba se puede ver una selección de los equipo que tienen más futbolistas en el juego. Entre los primeros resultados, lógicamente se encuentran equipos muy populares.
(player['Position'].value_counts()).plot()
(player['Position'].value_counts()).plot(kind = "bar", color = "purple") #Creación de un gráfico(plot) de tipo barras.
plt.title('Gráfico: Número de jugadores por posición') #Título del gráfico
plt.xlabel('Posición') #Título del eje X
plt.ylabel('Número de jugadores') #Título del eje Y
Text(0, 0.5, 'Número de jugadores')
En cuanto a la posición, es fácilmente analizable desde una perpectiva gráfica, ya que existen menos valores. El valor más repetido es "ST" que correponde a la posición de "Delantero Centro". Sorprendentemente la segunda es "GK", que corresponde a "Portero". Podría ser llamativo, de no ser por el hecho de que en el dataset las posiciones están muy disgregadas. Es decir, todos los defensas no toman el mismo valor, sino que pueden ser "CB" (defensa central), "LB"(lateral izquierdo) o "RB" (lateral derecho), entre otros. en tercera posición, se encuentra precisamente el puesto de "defensa central".
En cuanto a los menos representados se hallan "LF" y "RF", que serán el equivalente a "segundo delantero derecho" y "segundo delantero izquierdo", ya que son posiciones bastante menos comunes.
De cara a ver cómo es la distribución de la valoración media (Overall) para cada posición, se ha generado un gráfico boxplot o de bigotes:
f, ax = plt.subplots(figsize=(20, 15))
sns.boxplot(x = 'Overall', y = 'Position',
palette=["r", "b"],
data=player)
sns.despine(offset=10, trim=True)
Las medianas parecen varias. Concretamente, las más elevadas están en posiciones que anteriormente estaban entre las menos representadas en la muestra. Esto puede ser debido a que, de esas posiciones, haya menos valores y que estos tengan una valoración buena. Por otro lado, en posiciones más populares parecen concentrarse la mayor cantidad de outliers. Esto podría explicarse debido a que estas posiciones tengan jugadores con unas medias muy elevadas con respecto al resto de futbolistas que comparten su posición.
(player['Work Rate'].value_counts()).plot()
(player['Work Rate'].value_counts()).plot(kind = "bar", color = "cyan") #Creación de un gráfico(plot) de tipo barras.
plt.title('Gráfico: Número de jugadores según desempeño en defensa/ataque') #Título del gráfico
plt.xlabel('Desempeño defensa/ataque') #Título del eje X
plt.ylabel('Número de jugadores') #Título del eje Y
Text(0, 0.5, 'Número de jugadores')
Interesaba comfirmar también si, como era de esperar, en el dataset existían más jugadores diestros que zurdos. Ahora bien, gracias al gráfico boxplot podemos estudiar si hay diferencias reseñables de valoración dependiendo si el jugador es diestro o zurdo.
Lo más común son jugadores que tengan un desempeño medio tanto en defensa como en ataque, es decir, equilibrados. Esta variable indica también la tendencia del jugador si suele ser más de defensa o de ataque. Vemos que el valor que suele tomar es un valor medio en ambos aspectos, y que el segundo y tercera valor contiene una tendencia más alta en cuanto a la defensa o el ataque, respectivamente.
f, ax = plt.subplots(figsize=(20, 15))
sns.despine(f)
sns.histplot(
player,
x="Overall", hue="Preferred Foot",
multiple="stack",
palette="light:b_r",
edgecolor=".3",
linewidth=.1,
log_scale=True,
)
<AxesSubplot:xlabel='Overall', ylabel='Count'>
Interesaba confirmar, si como era de esperar existían en la muestra más jugadores diestros que zurdos. Este gráfico representa la cantidad de jugadores diestros (color gris) y zurdos (color azul) para cada nivel de valoración. En todos los valores del eje X los diestros son más. Sin embargo, algo que se puede intuir es que la cantidades de observaciones aumenta entre los valores de 60 y 70 de valoración. De este misma variable, se ha planteado un gráfico boxplot:
sns.boxplot(x = 'Overall', y = 'Preferred Foot',
palette=["m", "g"],
data=player)
sns.despine(offset=10, trim=True)
En el gráfico no existen grandes diferencias. Sí es cierto que la mediana de los zurdos (color lila) parece ser algo superior a la de los diestros (color verde). Por otro lado, el tercer cuartil de los diestros parece algo más voluminoso. Los rangos son algo menores en los zurdos, y además parecen contar con menos valores atípicos u outliers en la muestra.
sns.displot(
data=player,
x="Overall", hue="Real Face",
kind="kde", height=7,
multiple="fill", clip=(0, None),
palette="ch:rot=-.35,hue=1,light=.70",
)
<seaborn.axisgrid.FacetGrid at 0x283975a4280>
Como se ha mencionado en la introducción, la variable "Real Face" hace referencia a los jugadores que cuentan con su cara real implantada en su personaje del juego. En caso contrario, cuentan con una cara genérica. Se ha seleccionado el presente gráfico porque muestra de forma clara cómo según va creciendo la valoración de las observaciones, mayor porcentaje de jugadores cuentan con su cara real. Cabe pensar, lógicamente, que el videjuego se esfuerza por tener las caras reales de los mejores y más populares jugadores. Mientras que para valoraciones por debajo de 70 no hay casi jugadores con cara real, desde 80 hacia arriba la mayoría sí cuenta con ella.
sns.scatterplot(data=player, x="Overall", y="Potential", color = "m")
<AxesSubplot:xlabel='Overall', ylabel='Potential'>
En el gráfico de arriba, se realiza un scatterplot para ver cómo se relaciona la distribución de la valoración general de los jugadores y la valoración potencial. El hecho de que la parte inferior derecha esté vacía se produce debido a que la valoración potencial es la máxima que pueden alcanzar, por lo que no puede ser menor a la que ya tienen.
sns.scatterplot(data=player, x="Overall", y="Age", color = "g")
<AxesSubplot:xlabel='Overall', ylabel='Age'>
En este otro gráfico, se compara la edad y la valoración. Destaca que las valoraciones más elevadas parecen encontrarse entre los 25 y un punto medio entre los 30 y 35. Esto coincide con la edad que se considera de madurez de los futbolistas. Por otro lado, la acumulación de los valores más bajos corresponden a los jugadores más jóvenes.
sns.scatterplot(data=player, x="Potential", y="Age", color = "m")
<AxesSubplot:xlabel='Potential', ylabel='Age'>
Si comparamos el potencial con la edad, el gráfico cambia. Aquí los potenciales más altos parecen concentrarse en una edad algo inferior a como ocurría con la valoración general.
sns.scatterplot(data=player, x="Potential", y="Age", color = "m")
sns.scatterplot(data=player, x="Overall", y="Age", color = "g")
<AxesSubplot:xlabel='Potential', ylabel='Age'>
Para finalizar, superponiendo ambos gráficos se pueden observar los puntos morados sobresaliendo en una zona en la que no hay verdes. Una zona reservada para potenciales elevados de jugadores jóvenes.
Como se puede observar existe una gran diferencia de datos en favor de los jugadores diestros con respecto a los zurdos.
sns.pairplot(player)
<seaborn.axisgrid.PairGrid at 0x283973a3eb0>
Pese a no poder extraer grandes conclusiones del gráfico, se trata de una representación simple de todas las variables numéricas juntas. La línea diagonal es el gráfico de cada variables consigo misma, mientras que el resto de gráficas son la relación de las variables una a una.
f, ax = plt.subplots(figsize=(20, 10))
sns.violinplot(data=player, palette="Set2", bw=.10, cut=1, linewidth=2)
<AxesSubplot:>
En este gráfico en forma de violín se pueden ver representadas todas las variables de la muestra. Las tres primeras están muy concentradas lógicamente. La edad normal de un futbolista tiene unos valores muy limitados con respecto al resto de variables cuyos valores pueden estar entre 1 y 99.
El potencial tiene unos valores algo superiores y ligeramente más concentrados a las de la valoración global de cada jugador, también normal por la naturaleza de ambas variables.
En cuanto al resto, algunas como "Finishing", "ShotPower" o "Penalties" presentan una forma más delgada, lo que indica que sus datos están menos concentrados que el resto. La explicación es que estas variables son muy diferentes en los diferentes jugadores. Habrá jugadores de tengan una definición, una potencia de tiro o un tiro de penati muy altos, mientras que otros presentan unos valores muy bajos dependiendo de su posición en el campo, estilo o incluso fisionomía del jugador. En otras como "BallControl", "Dribbling" o "Stamina" los datos parecen concentrarse algo más, indicando que no existen tantas diferencias entre unos jugadores y otros en estos aspectos.
Por último, en variables como "HeadingAccuracy", "Dribbling" o "ShotPower" existe una concentración reseñable alrededor de unos valores. Sin embargo, también existe una concentración en la zona inferior de esos violines, indicando que la mayoría de jugadores está en esos valores, pero que también existe una reseñable concentración en futbolistas que cuentan con una valoración muy baja en esos atributos.
Se proecede a construir la matriz de correlaciones de forma numérica y luego gráfica, a fin de ver las posibles correlaciones entre las variables disponibles.
player.corr()
| Age | Overall | Potential | Finishing | HeadingAccuracy | Dribbling | BallControl | Acceleration | Agility | ShotPower | Stamina | Strength | Aggression | Penalties | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Age | 1.000000 | 0.453166 | -0.253448 | 0.069551 | 0.148819 | 0.011282 | 0.086558 | -0.158542 | -0.018230 | 0.158180 | 0.099613 | 0.334985 | 0.267209 | 0.140404 |
| Overall | 0.453166 | 1.000000 | 0.660344 | 0.333163 | 0.342279 | 0.374112 | 0.461912 | 0.198356 | 0.267591 | 0.442843 | 0.367427 | 0.350298 | 0.396763 | 0.341911 |
| Potential | -0.253448 | 0.660344 | 1.000000 | 0.243062 | 0.201236 | 0.315844 | 0.354751 | 0.236561 | 0.224210 | 0.288428 | 0.202828 | 0.074086 | 0.170140 | 0.224043 |
| Finishing | 0.069551 | 0.333163 | 0.243062 | 1.000000 | 0.473408 | 0.824270 | 0.788063 | 0.606497 | 0.644974 | 0.815463 | 0.510985 | -0.009987 | 0.244359 | 0.838395 |
| HeadingAccuracy | 0.148819 | 0.342279 | 0.201236 | 0.473408 | 1.000000 | 0.550802 | 0.658754 | 0.327905 | 0.259166 | 0.612407 | 0.633410 | 0.487814 | 0.693678 | 0.551363 |
| Dribbling | 0.011282 | 0.374112 | 0.315844 | 0.824270 | 0.550802 | 1.000000 | 0.939060 | 0.748186 | 0.765450 | 0.805114 | 0.686436 | -0.033382 | 0.442878 | 0.769755 |
| BallControl | 0.086558 | 0.461912 | 0.354751 | 0.788063 | 0.658754 | 0.939060 | 1.000000 | 0.675757 | 0.704862 | 0.831721 | 0.728882 | 0.087629 | 0.551886 | 0.769749 |
| Acceleration | -0.158542 | 0.198356 | 0.236561 | 0.606497 | 0.327905 | 0.748186 | 0.675757 | 1.000000 | 0.811144 | 0.539625 | 0.606893 | -0.167459 | 0.250232 | 0.532684 |
| Agility | -0.018230 | 0.267591 | 0.224210 | 0.644974 | 0.259166 | 0.765450 | 0.704862 | 0.811144 | 1.000000 | 0.574424 | 0.568523 | -0.235089 | 0.240995 | 0.566410 |
| ShotPower | 0.158180 | 0.442843 | 0.288428 | 0.815463 | 0.612407 | 0.805114 | 0.831721 | 0.539625 | 0.574424 | 1.000000 | 0.616633 | 0.169834 | 0.493639 | 0.795152 |
| Stamina | 0.099613 | 0.367427 | 0.202828 | 0.510985 | 0.633410 | 0.686436 | 0.728882 | 0.606893 | 0.568523 | 0.616633 | 1.000000 | 0.263675 | 0.646131 | 0.515538 |
| Strength | 0.334985 | 0.350298 | 0.074086 | -0.009987 | 0.487814 | -0.033382 | 0.087629 | -0.167459 | -0.235089 | 0.169834 | 0.263675 | 1.000000 | 0.473694 | 0.053872 |
| Aggression | 0.267209 | 0.396763 | 0.170140 | 0.244359 | 0.693678 | 0.442878 | 0.551886 | 0.250232 | 0.240995 | 0.493639 | 0.646131 | 0.473694 | 1.000000 | 0.337531 |
| Penalties | 0.140404 | 0.341911 | 0.224043 | 0.838395 | 0.551363 | 0.769755 | 0.769749 | 0.532684 | 0.566410 | 0.795152 | 0.515538 | 0.053872 | 0.337531 | 1.000000 |
mask= np.zeros_like(player.corr())
mask[np.triu_indices_from(mask)]=True
f, ax = plt.subplots(figsize=(15, 9))
sns.heatmap(player.corr(),annot=True, mask=mask, vmax=1, square=True)
<AxesSubplot:>
El gráfico de correlaciones representa de forma gráfica la matriz de correlaciones obtenida anteriormente. Los colores más claros representas las variables más correlacionadas entre sí. Del gráfico cabe extraer una serie de conclusiones:
Parece no existir ninguna variable muy altamente correlacionada con la valoración general u "Overall". Algo de correlación parece existir entre esta y "Potential" o valoración potencial.
La correlación más elevada es la existente entre "Dribbling" y "BallControl". Parece lógico, un jugador que sea capaz de driblar con facilidad tendrá un buen control de balón también, y vicerversa. Esta segunda, también se encuentra relacionada con "ShotPower", pareciendo que quien tiene buen control de balón, suele tener una buena potencia de tiro. Este resultado es interesante, pues la relación no es tan obvia como la anterior.
La potencia de tiro también se relaciona estrechamente con la definición, el dribbling y la habilidad para tirar penaltis. Así como la agilidad con la aceleración, o la misma definción con el dribbling.
Estos son los resultados de un primer Análisis Exploratorio de la presente base de datos. Dada la naturaleza de las variables se ha intentado hacer primar un análisis más gráfico y visual de la muestra disponible. Con un análisis más profundo y desde otros puntos de vista, seguramente se pueda llegar a sacar mayores y más relevantes conclusiones acerca de los datos existentes.